home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
1843
/
1843.xpi
/
components
/
firebug-http-observer.js
< prev
next >
Wrap
Text File
|
2010-01-15
|
7KB
|
265 lines
/* See license.txt for terms of usage */
// ************************************************************************************************
// Constants
const CLASS_ID = Components.ID("{2D92593E-14D0-48ce-B260-A9881BBF9C8B}");
const CLASS_NAME = "Firebug HTTP Observer Service";
const CONTRACT_ID = "@joehewitt.com/firebug-http-observer;1";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
var categoryManager = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
// ************************************************************************************************
// HTTP Request Observer implementation
var FBTrace = null;
var fbs = null;
/**
* @service This service is intended as the only HTTP observer registered by Firebug.
* All FB extensions and Firebug itself should register a listener within this
* service in order to listen for http-on-modify-request, http-on-examine-response and
* http-on-examine-cached-response events.
*
* See also: <a href="http://developer.mozilla.org/en/Setting_HTTP_request_headers">
* Setting_HTTP_request_headers</a>
*/
function HttpRequestObserver()
{
this.observers = [];
this.isObserving = false;
// Get firebug-trace service for logging (the service should be already
// registered at this moment).
FBTrace = Cc["@joehewitt.com/firebug-trace-service;1"]
.getService(Ci.nsISupports).wrappedJSObject.getTracer("extensions.firebug");
// Get firebug-service to listen for suspendFirebug and resumeFirebug events.
fbs = Cc["@joehewitt.com/firebug;1"].getService(Ci.nsISupports).wrappedJSObject;
this.initialize();
}
/* nsIFireBugClient */
var FirebugClient =
{
disableXULWindow: function()
{
if (gHttpObserverSingleton)
gHttpObserverSingleton.unregisterObservers();
},
enableXULWindow: function()
{
if (gHttpObserverSingleton)
gHttpObserverSingleton.registerObservers();
}
}
HttpRequestObserver.prototype =
/** lends HttpRequestObserver */
{
initialize: function()
{
fbs.registerClient(FirebugClient);
observerService.addObserver(this, "quit-application", false);
this.registerObservers();
},
shutdown: function()
{
fbs.unregisterClient(FirebugClient);
observerService.removeObserver(this, "quit-application");
},
registerObservers: function()
{
if (this.isObserving)
return;
observerService.addObserver(this, "http-on-modify-request", false);
observerService.addObserver(this, "http-on-examine-response", false);
observerService.addObserver(this, "http-on-examine-cached-response", false);
this.isObserving = true;
},
unregisterObservers: function()
{
if (!this.isObserving)
return;
observerService.removeObserver(this, "http-on-modify-request");
observerService.removeObserver(this, "http-on-examine-response");
observerService.removeObserver(this, "http-on-examine-cached-response");
this.isObserving = false;
},
/* nsIObserve */
observe: function(subject, topic, data)
{
if (topic == "quit-application") {
this.shutdown();
return;
}
try
{
if (topic == "http-on-modify-request" ||
topic == "http-on-examine-response" ||
topic == "http-on-examine-cached-response")
{
this.notifyObservers(subject, topic, data);
}
}
catch (err)
{
}
},
/* nsIObserverService */
addObserver: function(observer, topic, weak)
{
if (topic != "firebug-http-event")
throw Cr.NS_ERROR_INVALID_ARG;
this.observers.push(observer);
},
removeObserver: function(observer, topic)
{
if (topic != "firebug-http-event")
throw Cr.NS_ERROR_INVALID_ARG;
for (var i=0; i<this.observers.length; i++) {
if (this.observers[i] == observer) {
this.observers.splice(i, 1);
return;
}
}
},
notifyObservers: function(subject, topic, data)
{
for (var i=0; i<this.observers.length; i++)
this.observers[i].observe(subject, topic, data);
},
enumerateObservers: function(topic)
{
return null;
},
/* nsISupports */
QueryInterface: function(iid)
{
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsIObserverService) ||
iid.equals(Ci.nsIObserver)) {
return this;
}
throw Cr.NS_ERROR_NO_INTERFACE;
}
}
function safeGetName(request)
{
try
{
return request.name;
}
catch (exc)
{
return null;
}
}
// ************************************************************************************************
// Service factory
var gHttpObserverSingleton = null;
var HttpRequestObserverFactory =
{
createInstance: function (outer, iid)
{
if (outer != null)
throw Cr.NS_ERROR_NO_AGGREGATION;
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsIObserverService) ||
iid.equals(Ci.nsIObserver))
{
if (!gHttpObserverSingleton)
gHttpObserverSingleton = new HttpRequestObserver();
return gHttpObserverSingleton.QueryInterface(iid);
}
throw Cr.NS_ERROR_NO_INTERFACE;
},
QueryInterface: function(iid)
{
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsISupportsWeakReference) ||
iid.equals(Ci.nsIFactory))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
}
};
// ************************************************************************************************
// Module implementation
var HttpRequestObserverModule =
{
registerSelf: function (compMgr, fileSpec, location, type)
{
compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
compMgr.registerFactoryLocation(CLASS_ID, CLASS_NAME,
CONTRACT_ID, fileSpec, location, type);
},
unregisterSelf: function(compMgr, fileSpec, location)
{
compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
compMgr.unregisterFactoryLocation(CLASS_ID, location);
},
getClassObject: function (compMgr, cid, iid)
{
if (!iid.equals(Ci.nsIFactory))
throw Cr.NS_ERROR_NOT_IMPLEMENTED;
if (cid.equals(CLASS_ID))
return HttpRequestObserverFactory;
throw Cr.NS_ERROR_NO_INTERFACE;
},
canUnload: function(compMgr)
{
return true;
}
};
// ************************************************************************************************
function NSGetModule(compMgr, fileSpec)
{
return HttpRequestObserverModule;
}